package com.catazy.ocrdemo.ui.activity.main

import android.content.Context
import android.content.res.Resources
import android.graphics.BitmapFactory
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.FileIOUtils
import com.blankj.utilcode.util.FileUtils
import com.blankj.utilcode.util.LogUtils
import com.catazy.cameralib.OpenCvManager
import com.catazy.mvvmlib.base.viewmodel.BaseViewModel
import com.catazy.ocrdemo.R
import com.catazy.ocrdemo.manager.OcrManager
import kotlinx.coroutines.launch

/**
 * 作者: Tao
 * 日期: 2024/3/6
 * 时间: 17:01
 * 描述: 主页ViewModel
 */
class MainViewModel : BaseViewModel() {

    /**
     * 保存训练数据到本地
     * @param context Context
     */
    fun saveTrainedDataToFile(context: Context) {
        viewModelScope.launch {
            val tessDataPath = context.filesDir.absolutePath
            val trainedEngPath = "$tessDataPath/tessdata/eng.traineddata"
            val trainedChiPath = "$tessDataPath/tessdata/chi_sim.traineddata"

            // 保存eng.traineddata文件到本地
            if (!FileUtils.isFileExists(trainedEngPath)) {
                // 1.从assets目录下获取eng.traineddata文件
                val inputStream = context.assets.open("eng.traineddata")
                val isCreated = FileUtils.createOrExistsFile(trainedEngPath)
                if (isCreated) {
                    // 2.将eng.traineddata文件保存到本地指定路径
                    val isWriteSuccess = FileIOUtils.writeFileFromIS(trainedEngPath, inputStream)
                    if (isWriteSuccess) {
                        // 3.保存成功
                        LogUtils.i("eng.traineddata文件保存成功")
                    } else {
                        // 3.保存失败
                        LogUtils.e("eng.traineddata文件保存失败")
                    }
                }
            }

            // 保存chi_sim.traineddata文件到本地
            if (!FileUtils.isFileExists(trainedChiPath)) {
                val inputStreamChi = context.assets.open("chi_sim.traineddata")
                val isCreated = FileUtils.createOrExistsFile(trainedChiPath)
                if (isCreated) {
                    // 2.将eng.traineddata文件保存到本地指定路径
                    val isWriteSuccess = FileIOUtils.writeFileFromIS(trainedChiPath, inputStreamChi)
                    if (isWriteSuccess) {
                        // 3.保存成功
                        LogUtils.i("eng.traineddata文件保存成功")
                    } else {
                        // 3.保存失败
                        LogUtils.e("eng.traineddata文件保存失败")
                    }
                }
            }

            // 中、英文训练模型加载完成才去初始化
            OcrManager.INSTANCE.initTess(tessDataPath)

        }
    }

    /**
     * 识别图片
     */
    fun recognizeImage(resources: Resources) {
        // 识别图片
        viewModelScope.launch {
            BitmapFactory.decodeResource(resources, R.mipmap.sample).let {
                OcrManager.INSTANCE.recognizeImage(it)
            }
        }
    }

    fun initOpenCv(){
        // 初始化OpenCV
        viewModelScope.launch {
            OpenCvManager.INSTANCE.initOpenCv()
        }
    }

}